package basics.day17.IntegerDemo;

public class Test {
    public static void main(String[] args) {
        // fun_1();
        // fun_2();
        // fun_3();
        // fun_4();
        // fun_5();
        fun_6();
    }

    /*
     * JDK1.5后出现的新特性，自动装箱和自动拆箱
     * 自动装箱：基本数据类型，直接变为对象
     * 自动拆箱：对象中的数据变回基本数据类型
     * */
    public static void fun_6() {
        // Integer是引用类型，而5是基本类型，此时二者相等的原因就是自动装箱，将基本类型转成对象，
        // 就相当于 Integer in = new Integer(5);
        Integer in = 5;
        /*
         * in已经是引用类型了，为什么还能和基本类型做计算呢：
         *      in+1，首先in自动拆箱，in.intValue转成基本类型，然后做计算，
         *      之后再赋值给引用类型in，in + 1 经过自动拆箱计算后，再进行自动装箱转成引用类型
         * */
        in = in + 1;
        System.out.println(in); // 6
        System.out.println(in instanceof Integer); // true

        System.out.println("==================================");
        Integer a = 500;
        Integer b = 500;
        System.out.println(a == b); // false 比较的是存储地址
        System.out.println(a.equals(b)); // true 比较的是值

        System.out.println("==================================");
        Integer aa = 127;
        Integer bb = 127;
        /*
         * aa == bb 为 true 的原因是：
         *   数据在 byte 范围内 JVM 为了节约内存，不重新new对象
         *   相当于：
         *       Integer aa = new Integer(127);
         *       Integer bb = aa;  // 注意这里没有自己重新new  而是直接使用aa的
         *       所以 aa == bb 为true
         * */
        System.out.println(aa == bb);  // true
        System.out.println(aa.equals(bb));  // true
    }

    /*
     * 构造器实现String ---> Integer类型
     * */
    public static void fun_5() {
        Integer in = new Integer("100");
        int i = in.intValue();
        System.out.println(--i);
    }

    /*
     * toString(int i, int radix)
     * 返回用第二个参数指定基数表示的第一个参数的字符串表示形式。
     * 将十进制的整数转成二进制的数字字符串
     * */
    public static void fun_4() {
        int i = 5;
        String s = Integer.toString(i, 2);
        System.out.println(s); // 101
    }

    /*
    toString(int i)
    返回一个表示指定整数的 String 对象。
     */
    public static void fun_3() {
        int i = 1000;
        String s = Integer.toString(i);
        System.out.println(s);
    }

    /*
    parseInt(String s, int radix)
    使用第二个参数指定的基数，将字符串参数解析为有符号的整数。
    将2进制的纯数字字符串装成int的十进制
     */
    public static void fun_2() {
        int i = Integer.parseInt("110", 2);
        System.out.println(i); // 6
    }

    /*
    parseInt(String s)
     将字符串参数作为有符号的十进|制整数进行解析。
     必须是纯数字字符串
     */
    public static void fun_1() {
        int i = Integer.parseInt("112341");
        System.out.println(i); // 112341
    }
}
